package com.sky.service.impl;

import cn.mybatis.mp.core.sql.executor.chain.QueryChain;
import com.sky.dto.BookInventoryStatusDTO;
import com.sky.entity.Books;
import com.sky.entity.Userborrowhistory;
import com.sky.mapper.BooksMapper;
import com.sky.mapper.UserborrowhistoryMapper;
import com.sky.service.BookInventoryStatisticsService;
import com.sky.vo.BookInventoryStatusVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 图书库存统计服务实现类
 * 
 * 该服务主要负责：
 * 1. 统计图书总库存量
 * 2. 计算当前借出图书数量
 * 3. 分析在库图书数量
 * 4. 计算各类图书状态的占比
 * 
 * 统计逻辑说明：
 * - 总库存量：通过累加每本图书的库存数量(stockQuantity)获得
 * - 借出数量：统计借阅历史中状态为"借阅中"的记录数
 * - 在库数量：总库存量减去借出数量
 * - 占比计算：各状态数量除以总库存量，结果保留一位小数
 */
@Service
@Slf4j
public class BookInventoryStatisticsServiceImpl implements BookInventoryStatisticsService {

    @Autowired
    private BooksMapper booksMapper;

    @Autowired
    private UserborrowhistoryMapper userborrowhistoryMapper;

    /**
     * 获取图书库存状态统计信息
     * 
     * @param bookInventoryStatusDTO 包含统计的时间范围参数
     * @return 返回库存统计结果，包括：
     *         - totalBooks: 总藏书量
     *         - inventoryStatus: 包含各状态（在库、借出）的数量和占比
     * 
     * 统计步骤：
     * 1. 查询所有图书并计算总库存量
     * 2. 根据时间范围统计借出图书数量
     * 3. 计算在库图书数量和各状态占比
     * 4. 组装统计结果
     * 
     * 注意事项：
     * - 总库存量为所有图书的stockQuantity之和
     * - 借出图书仅统计状态为"借阅中"的记录
     * - 在库图书数量 = 总库存量 - 借出数量
     * - 所有百分比计算结果均保留一位小数
     */
    @Override
    public BookInventoryStatusVO getInventoryStatus(BookInventoryStatusDTO bookInventoryStatusDTO) {
        // 1. 获取总库存量（所有图书的stockQuantity之和）
        List<Books> allBooks = QueryChain.of(booksMapper).list();
        int totalStockQuantity = allBooks.stream()
                .mapToInt(Books::getStockQuantity)
                .sum();

        // 2. 获取借出图书数量（状态为"借阅中"的记录数）
        Long borrowedBooks = Long.valueOf(QueryChain.of(userborrowhistoryMapper)
                .eq(Userborrowhistory::getStatus, "借阅中")
                .between(bookInventoryStatusDTO.getStartDate() != null && bookInventoryStatusDTO.getEndDate() != null,
                        Userborrowhistory::getBorrowDate,
                        bookInventoryStatusDTO.getStartDate(),
                        bookInventoryStatusDTO.getEndDate())
                .count());

        // 3. 计算在库图书数量
        int availableBooks = totalStockQuantity - borrowedBooks.intValue();

        // 4. 构建状态列表
        List<BookInventoryStatusVO.StatusItem> statusItems = new ArrayList<>();

        // 添加在库图书状态
        double availablePercentage = totalStockQuantity == 0 ? 0 : (availableBooks * 100.0 / totalStockQuantity);
        statusItems.add(BookInventoryStatusVO.StatusItem.builder()
                .name("在库图书")
                .value(availableBooks)
                .percentage(Math.round(availablePercentage * 10.0) / 10.0)
                .build());

        // 添加借出图书状态
        double borrowedPercentage = totalStockQuantity == 0 ? 0 : (borrowedBooks * 100.0 / totalStockQuantity);
        statusItems.add(BookInventoryStatusVO.StatusItem.builder()
                .name("借出图书")
                .value(borrowedBooks.intValue())
                .percentage(Math.round(borrowedPercentage * 10.0) / 10.0)
                .build());

        // 5. 构建并返回结果
        return BookInventoryStatusVO.builder()
                .totalBooks(totalStockQuantity)
                .inventoryStatus(statusItems)
                .build();
    }
} 